#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     ctx
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/12/13
-------------------------------------------------
   修改描述-2021/12/13:         
-------------------------------------------------
"""
from grpcframe.exts.grpclocal.request import Request
from grpcframe.exts.grpclocal.g import _request_ctx_stack
import typing as t


class RequestContext:
    '''
    创建一个请求处理对象,代码主要参考值flask框架的
    '''
    def __init__(self, params=None, context=None) -> None:
        """ 创建请求上下文
        """
        # 创建GRPC中的请求提信息
        self.request = Request(params, context)
        # 是否是保存
        self.preserved = False
        self._preserved_exc = None

    def push(self) -> None:
        """ 将请求上下文入栈
        """
        top = _request_ctx_stack.top
        if top is not None and top.preserved:
            # 记录异常错误信息
            top.pop(top._preserved_exc)
        # 入栈存在的是整个的RequestContext的对象，但是在调用我们的代理的时候取的是self.request的属性
        _request_ctx_stack.push(self)

    def pop(self, exc: t.Optional[BaseException] = object()) -> None:
        """ 将请求出栈
        """
        rv = _request_ctx_stack.pop()
        if rv is not self:
            raise RuntimeError("Popped wrong request context")

    def __enter__(self) -> "RequestContext":
        self.push()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.pop(exc_val)
